#include "appinitializer.h"
#include "mysqldatabase.h"  // 具体数据库实现
#include <QDebug>
#include <QSqlDatabase>

// 静态成员变量的类外初始化（Qt 5.12 必须显式初始化）
std::unique_ptr<Database> AppInitializer::m_db = nullptr;
DatabaseConfig AppInitializer::m_config;
QString AppInitializer::m_lastError = "";

// 私有构造函数：外部无法创建实例
AppInitializer::AppInitializer(QObject *parent)
    : QObject(parent)
{
}

// 静态初始化方法：程序启动时调用一次
bool AppInitializer::initialize()
{
    // 避免重复初始化
    if (m_db != nullptr) {
        qDebug() << "数据库已初始化，无需重复操作";
        return true;
    }

    // 加载配置文件（失败则用默认配置）
    QString configPath = "database.ini";
    qDebug() << "尝试加载配置文件:" << configPath;
    if (!m_config.loadConfig(configPath)) {
        qWarning() << "配置文件加载失败，使用默认配置连接数据库";
    } else {
        qDebug() << "配置文件加载成功";
    }

    // 创建MySQL数据库实例
    m_db = std::make_unique<MySQLDatabase>();

    // 尝试连接数据库
    qDebug() << "正在尝试连接数据库...";
    qDebug() << "可用的数据库驱动：" << QSqlDatabase::drivers();
    qDebug() << "数据库配置 - 主机:" << m_config.host() << "端口:" << m_config.port() << "数据库:" << m_config.databaseName();
    if (!m_db->connect(m_config)) {
        // 拼接错误信息
        QString connectionInfo = QString("主机: %1:%2, 数据库: %3, 用户: %4")
                                 .arg(m_config.host(),
                                      QString::number(m_config.port()),
                                      m_config.databaseName(),
                                      m_config.userName());
        m_lastError = QString("数据库连接失败\n%1\n错误: %2")
                      .arg(connectionInfo, m_db->lastError());
        qDebug() << "数据库连接失败:" << m_lastError;
        m_db.reset(); // 连接失败，释放实例
        return false;
    }

    qDebug() << "数据库连接成功";
    qDebug() << "连接状态:" << (m_db ? "已连接" : "未连接");

    qDebug() << "数据库初始化成功";
    return true;
}

// 静态方法：全局获取数据库连接
Database* AppInitializer::database()
{
    return m_db.get();
}

// 静态方法：全局获取错误信息
QString AppInitializer::error()
{
    return m_lastError;
}
